home *** CD-ROM | disk | FTP | other *** search
- /* File : bcmp.c
- Author : Richard A. O'Keefe.
- Updated: 23 April 1984
- Defines: bcmp()
-
- bcmp(s1, s2, len) returns 0 if the "len" bytes starting at "s1" are
- identical to the "len" bytes starting at "s2", non-zero if they are
- different. The 4.2bsd manual page doesn't say what non-zero value
- is returned, though the BUGS note says that it takes its parameters
- backwards from strcmp. This suggests that it is something like
- for (; --len >= 0; s1++, s2++)
- if (*s1 != *s2) return *s2-*s1;
- return 0;
- There, I've told you how to do it. As the manual page doesn't come
- out and *say* that this is the result, I tried to figure out what a
- useful result might be. (I'd forgotten than strncmp stops when it
- hits a NUL, which the above does not do.) What I came up with was:
- the result is the number of bytes in the differing tails. That is,
- after you've skipped the equal parts, how many characters are left?
- To put it another way, N-bcmp(s1,s2,N) is the number of equal bytes
- (the size of the common prefix). After deciding on this definition
- I discovered that the CMPC3 instruction does exactly what I wanted.
- The code assumes that N is non-negative.
-
- Note: the "b" routines are there to exploit certain VAX order codes,
- but the CMPC3 instruction will only test 65535 characters. The asm
- code is presented for your interest and amusement.
- */
-
- #include "strings.h"
-
- #if VaxAsm
-
- int bcmp(s1, s2, len)
- char *s1, *s2;
- int len;
- {
- asm("cmpc3 12(ap),*4(ap),*8(ap)");
- }
-
- #else ~VaxAsm
-
- int bcmp(s1, s2, len)
- register char *s1, *s2;
- register int len;
- {
- while (--len >= 0 && *s1++ == *s2++) ;
- return len+1;
- }
-
- #endif VaxAsm
-